package com.syf.core;

import com.syf.core.config.SyApplicationConfiguration;
import com.syf.core.engine.SyFrameDefiner;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * ApplicationContextInitializer 是springboot的一个扩展点，可以帮助我们
 * 1、定制ApplicationContext配置：
 * 添加或修改ApplicationContext的属性；
 * 设置环境变量（Environment）或系统属性；
 * 注册自定义的PropertySources，以便在上下文初始化时注入自定义的属性值
 * 2、注册额外的Bean definition，自定义BeanPostProcessor等用于增强或修改容器中其他Bean的行为。
 * 3、初始化第三方库或中间件
 * 本次就是初始化书昀框架的重要组件对象。
 * 4、设置应用启动时所需的基础设施，如初始化日志框架、加密服务、国际化设置等。
 * 5、执行特定的初始化逻辑：执行一次性的初始化动作，比如配置系统层面的设定、读取外部配置文件并注入到环境中等。
 */
public class SyApplicationContextInitializer implements ApplicationContextInitializer {

    /**
     * 1、创建 配置参数对象
     * 2、创建 AppComponent（应用系统的组成部分：包括通信服务组件、业务逻辑-交易运行器、DFK-开发功能工具库）管理器对象，并完成各AppComponent加载
     * 3、创建 DFK管理器对象，加载各DFK
     * 4、创建 业务逻辑（交易）运行器(它是一个很特殊的AppComponent)；，加载各交易定义信息
     * 5、将2.3，4步骤中获取AppComponent、DFK、交易运行器中配置参数的key和默认值，加入配置参数补录器
     *
     * step-1
     */
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        SyApplicationConfiguration applicationConfiguration = new SyApplicationConfiguration(applicationContext);

        // 1、定义书昀框架BeanFactoryPostProcessor，为IOC补充定义书昀框架的服务提供bean
        applicationContext.addBeanFactoryPostProcessor(new SyFrameDefiner(applicationConfiguration));
    }
}
